package com.example.badminton.utils;

import com.example.badminton.entity.User;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
 * 用户信息工具类
 * 统一处理从请求中获取token并解析用户信息
 */
public class UserUtils {

    /**
     * 从当前请求中获取用户信息
     * @return 用户信息，如果未登录或token无效返回null
     */
    public static User getCurrentUser() {
        return UserContext.getUser();
    }

    /**
     * 从当前请求中获取用户ID
     * @return 用户ID，如果未登录或token无效返回null
     */
    public static Long getCurrentUserId() {
        return UserContext.getUser().getId();
    }

    /**
     * 检查当前用户是否已登录
     * @return true表示已登录，false表示未登录
     */
    public static boolean isLoggedIn() {
        return getCurrentUserId() != null;
    }

    /**
     * 从请求头中获取token
     * @return token字符串，如果不存在返回null
     */
    private static String getTokenFromRequest() {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        if (attributes == null) {
            return null;
        }

        HttpServletRequest request = attributes.getRequest();
        String authHeader = request.getHeader("Authorization");

        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            return authHeader.substring(7);
        }

        return null;
    }

    /**
     * 验证token是否有效
     * @return true表示有效，false表示无效
     */
    public static boolean isTokenValid() {
        try {
            String token = getTokenFromRequest();
            if (token == null) {
                return false;
            }

            return JwtUtils.validateToken(token);
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 获取当前用户的用户名
     * @return 用户名，如果未登录返回null
     */
    public static String getCurrentUsername() {
        User user = getCurrentUser();
        return user != null ? user.getUsername() : null;
    }

    /**
     * 检查当前用户是否为管理员
     * @return true表示是管理员，false表示不是
     */
    public static boolean isAdmin() {
        User user = getCurrentUser();
        return user != null && "admin".equals(user.getRole());
    }

    /**
     * 判断是否匿名用户
     * @return
     */
    public static boolean isAnonymous() {
        return getCurrentUser() == null;
    }

} 